package util;

import java.util.Scanner;

/**
 * @ClassName CMUtil
 * @Description CMUtility工具类
 * @Author Steven
 * @Date 2020/9/11 15:46
 * @Vision 1.0
 **/
public class CMUtility {
    private static Scanner scanner = new Scanner(System.in);

    /**
     * 用于界面菜单的选择。该方法读取键盘如果永固键入“1-5”中的任意字符，则方法返回。返回值为用户选择的数字
     */
    public static char readMenuSection() {
        char c;
        for (; ; ) {
            String str = readKeyBoard(1, false);
            c = str.charAt(0);
            if (c != '1' && c != '2' && c != '3' && c != '4' && c != '5') {
                System.out.print("选择错误，请重新输入：");
            } else {
                break;
            }
        }
        return c;
    }

    /**
     * c重键盘读取一个字符，并将其作为方法的返回值
     *
     * @return
     */
    public static char readChar() {
        String str = readKeyBoard(1, false);
        return str.charAt(0);
    }

    /**
     * 重键盘读取一个字符，并将其作为方法的返回值，如果用户不输入字符直接回车，方法将以default Value作为返回值。
     */
    public static char readChar(char defaultValue) {
        String str = readKeyBoard(1, true);
        return (str.length() == 0) ? defaultValue : str.charAt(0);
    }

    public static int readInt() {
        int n;
        for(; ;){
            String str=readKeyBoard(2,false);
            try{
                n=Integer.parseInt(str);
                break;
            }catch(NumberFormatException e){
                System.out.print("数字输入错误，请重新输入:");
            }
        }
        return n;
    }

    public static int readInt(int defaultValue) {
        int n;
        for (; ; ) {
            String str = readKeyBoard(2, true);
            if (str.equals("")) {
                return defaultValue;
            }
            try {
                n = Integer.parseInt(str);
                break;
            } catch (NumberFormatException e) {
                System.out.print("数字输入错误请重新输入！");
            }
        }
        return n;
    }

    /**
     * 从键盘读取一个长度不超过limit的字符串，并将其作为方法的返回值
     *
     * @return
     */
    public static String readString(int limit) {
        return readKeyBoard(limit, false);
    }
public static String readString(int limit,String defaultValue){
        String str=readKeyBoard(limit,true);
        return str.equals("")? defaultValue:str;
}

    /**
     * 从键盘读取一个长度不超过limit的字符串，并将其作为方法的返回值
     * 如果用户不输入字符儿直接回车，方法将以defaultValue 作为返回值
     *
     * @param limit
     * @param defaultValue
     * @return
     */
    public static String readKeyBoard(int limit, String defaultValue) {
        String str = readKeyBoard(limit, true);
        return str.equals("") ? defaultValue : str;


    }

    /**
     * 用于确认输入。该方法从键盘读取'Y'或'N'，并将其作为方法的返回值
     */
    public static char readConfirmSelection() {
        char c;
        for (; ; ) {
            String str = readKeyBoard(1, false).toUpperCase();
            c = str.charAt(0);
            if (c == 'Y' || c == 'N') {
                break;
            } else {
                System.out.print("选择错误，请重新输入：");
            }
        }
        return c;
    }

    private static String readKeyBoard(int limit, boolean blankReturn) {
        String line = "";
        while (scanner.hasNextLine()) {
            line = scanner.nextLine();
            if (line.length() == 0) {

                if (blankReturn) {
                    return line;
                } else {
                    continue;
                }
            }
            if (line.length() < 1 || line.length() > limit) {
                System.out.print("输入长度(不大于" + limit + ")错误，请重新输入");
                continue;
            }
            break;
        }
        return line;
    }

}
